home *** CD-ROM | disk | FTP | other *** search
- /* ******************************************************************* */
- /* ** ** */
- /* ** ATKeyboard Hilfedateiencompiler ** */
- /* ** Copright (C) 1992-1993 by Thomas Dreibholz ** */
- /* ** All rights reserved ** */
- /* ** ** */
- /* ******************************************************************* */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <libraries/dos.h>
-
- #define MAXSIZE(x) ((1000*5*22)+x)+1000000L
-
- #define PAGE_INDEX 1
- #define PAGE_TEXT 2
-
- ULONG x,y,z;
- UWORD i,j,k,zeile,a,b,t;
- UBYTE style,fp,bp;
- WORD cmd,page;
- UBYTE chr;
- ULONG offset;
- UWORD length;
- UBYTE s[500];
- UBYTE byte;
- UWORD wort;
- ULONG langwort;
- BOOL insert=FALSE;
-
- UBYTE *name;
- struct FileHandle *in,*out;
- UWORD GoTo[100];
- UWORD GoGad[100];
- UBYTE GoPic[100];
- UWORD GoToCnt;
- UWORD GoGadCnt;
- UBYTE GoPicCnt;
- UWORD DefaultCnt;
- UWORD Default[32];
- UBYTE Buffer[2048];
- ULONG Offset[1000];
- ULONG MOffset[1000];
- ULONG POffset[1000];
- ULONG TOffset[1000];
- ULONG GOffset[1000];
- ULONG PNOffset[1000];
- UWORD Length[1000];
- UBYTE Flags[1000];
- UBYTE mem[250];
- UBYTE *InBuf,*OutBuf;
- ULONG BufferSize;
- ULONG IPos,OPos,IMax;
- BOOL MainIndex;
-
-
- VOID Out(m,len)
- UBYTE *m;
- ULONG len;
- {
- REGISTER ULONG i,j;
-
- for(i=0;i<len;i++)
- {
- OutBuf[OPos]=m[i];
- OPos++;
- }
- }
-
- VOID WriteStyles()
- {
- sprintf(&mem,"\x9b%d;%d;%dm",style,fp,bp);
- i=strlen(&mem);
- Out(&mem,i);
- offset+=i;
- length+=i;
- }
-
- ULONG Get(m,len)
- UBYTE *m;
- ULONG len;
- {
- REGISTER ULONG i,j,x;
-
- x=0;
- for(i=0;((i<len) && (IPos<=IMax));i++)
- {
- m[i]=InBuf[IPos];
- IPos++; x++;
- }
- return(x);
- }
-
-
- VOID Stop(num)
- UWORD num;
- {
-
- Close(in);
- Close(out);
- DeleteFile(name);
- FreeMem(InBuf,BufferSize);
- switch(num)
- {
- case 1:
- printf("Zeile %ld: #endpage für nicht vorhandene Seite.\n",zeile);
- break;
- case 2:
- printf("Zeile %ld: #endpage erwartet.\n",zeile);
- break;
- case 3:
- printf("Zeile %ld: #goto/#gpic/#gad steht auf keiner Seite.\n",zeile);
- break;
- case 4:
- printf("Zeile %ld: Seitennummerangabe fehlerhaft.\n",zeile);
- break;
- case 5:
- printf("Zeile %ld: Unbekannter Befehl.\n",zeile);
- break;
- case 6:
- printf("Zeile %ld: #space steht auf keiner Seite.\n",zeile);
- break;
- case 7:
- printf("Zeile %ld: Seitentext ohne Seitenangabe durch #page/#index.\n",zeile);
- break;
- case 8:
- printf("Zeile %ld: Ungültige Bildnummer bei #gpic/picture.\n",zeile);
- break;
- case 20:
- printf("Zeile %ld: #picture darf auf keiner Seite stehen.\n",zeile);
- break;
- case 30:
- printf("Zeile %ld: Bild kann nicht geladen werden!\n",zeile);
- break;
- case 40:
- printf("Zeile %ld: Seitennummerangabe bei #default fehlerhaft.\n",zeile);
- break;
- }
- exit(0);
- }
-
-
- VOID main(argc,argv)
- LONG argc;
- UBYTE *argv[];
- {
- struct FileHandle *fh;
-
- printf("\nATUtilities Online-Hilfe Hilfstextcompiler - Version 2.0 25. 11. 1993\n");
- printf("Copyright (C) 1993 by Thomas Dreibholz. All rights reserved.\n");
- printf("----------------------------------------------------------------------\n");
- if(argc<3)
- {
- printf("Aufruf: %s [Quelltext] [Hilfedatei].\n",argv[0]);
- exit(0);
- }
- if(argc>3)
- {
- if(!(strcmp(argv[3],"+I"))) insert=TRUE;
- }
-
- MainIndex=FALSE;
- name=argv[2];
- in=Open(argv[1],MODE_OLDFILE);
- if(in!=NULL)
- {
- Seek(in,0,OFFSET_END);
- IMax=Seek(in,0,OFFSET_BEGINNING);
- BufferSize=IMax+MAXSIZE(IMax);
- InBuf=AllocMem(BufferSize,MEMF_CLEAR|MEMF_PUBLIC);
- if(InBuf!=NULL)
- {
- OutBuf=(UBYTE *)((ULONG)InBuf+IMax);
- IPos=0; OPos=0;
- out=Open(argv[2],MODE_NEWFILE);
- if(out!=NULL)
- {
- printf("Lese Quelltext ...\n");
- Read(in,InBuf,IMax);
- cmd=-1;
- page=-1;
- zeile=0;
- style=0; fp=33; bp=40;
- Out("HELP_2.0",8);
- offset=8;
- printf("Compiliere Quelltext ...\n");
- j=Get(&mem,1);
- chr=mem[0];
-
- while(j!=0)
- {
- if(chr=='#')
- {
- k=0; j=Get(&mem,1);
- while((mem[k]!=10)&&(k<249)&&(j==1))
- {
- k++; j=Get(&mem[k],1);
- }
- mem[k]=0x00;
- zeile++;
- if(j!=0)
- {
-
- if(!(strncmp(&mem,"rem",3)))
- {
- /* Kommentarzeile */
- }
-
- else if(!(strncmp(&mem,"default",7)))
- {
- for(i=0;i<30;i++) Default[i]=0;
- i=8;
- DefaultCnt=0;
- while(i<strlen(&mem))
- {
- if((mem[i]>='0')&&(mem[i]<='9'))
- {
- k=atol(&mem[i]);
- i+=4;
- if(k>999) Stop(40);
- Default[DefaultCnt]=k; DefaultCnt++;
- }
- else
- {
- i+=2;
- Default[DefaultCnt]=2000; DefaultCnt++;
- }
- }
- }
-
- else if(!(strncmp(&mem,"endpage",7)))
- {
- style=0; fp=33; bp=40;
- if(page!=-1)
- {
- if(GoToCnt>0)
- {
- MOffset[page]=offset;
- for(i=0;i<GoToCnt;i++)
- {
- Out(&GoTo[i],2L); offset+=2;
- }
- if(DefaultCnt>0)
- {
- wort=2000;
- Out(&wort,2L); offset+=2;
- }
- }
- if(DefaultCnt>0)
- {
- if(MOffset[page]==0) MOffset[page]=offset;
- for(i=0;i<DefaultCnt;i++)
- {
- if(Default[i]!=page)
- {
- Out(&Default[i],2L); t=Default[i]; offset+=2;
- }
- else
- {
- if((i>0)&&(Default[i-1]==2000)&&(Default[i+1]==2000))
- {
- OPos-=2; offset-=2;
- }
- else if((i==0)&&(i<Default-1)&&(Default[i+1]==2000))
- {
- i++;
- }
- }
- }
- if(t==2000)
- {
- OPos-=2; offset-=2;
- }
- }
- if(MOffset[page]!=0)
- {
- wort=0xFFFF;
- Out(&wort,2L); offset+=2;
- }
- if(GoGadCnt>0)
- {
- GOffset[page]=offset;
- wort=0xFFFF;
- for(i=0;i<GoGadCnt;i++)
- {
- Out(&GoGad[i],2L); offset+=2;
- }
- Out(&wort,2L); offset+=2;
- }
- if(GoPicCnt>0)
- {
- POffset[page]=offset;
- for(i=0;i<GoPicCnt;i++)
- {
- Out(&GoPic[i],1L); offset++;
- }
- byte=0xFF;
- Out(&byte,1L); offset++;
- }
- Length[page]=length;
- GoToCnt=0;
- GoPicCnt=0;
- GoGadCnt=0;
- }
- else Stop(1);
- cmd=-1; page=-1;
- }
-
- else if(!(strncmp(&mem,"page",4)))
- {
- if(page!=-1)
- {
- Stop(2);
- }
- page=atol(&mem[5]);
- if(page>999) Stop(4);
- if(page==0)
- {
- MainIndex=TRUE;
- printf("Info: Soll Seite 000 keine Indexseite sein?\n");
- }
- cmd=1;
- Offset[page]=offset;
- MOffset[page]=0;
- TOffset[page]=0;
- Length[page]=0;
- Flags[page]=PAGE_TEXT;
- a=9; b=0;
- while((mem[a]>25)&&(b<290))
- {
- s[b]=mem[a]; a++; b++;
- }
- s[b]=0x00;
- k=strlen(&s)+1;
- offset+=k;
- Out(&s,k);
- length=0;
- }
-
- else if(!(strncmp(&mem,"picture",7)))
- {
- if(page!=-1)
- {
- Stop(20);
- }
- page=atol(&mem[8]);
- if(page>99) Stop(8);
- PNOffset[page]=offset;
- a=11; b=0;
- while((mem[a]>25)&&(b<290))
- {
- s[b]=mem[a]; a++; b++;
- }
- s[b]=0x00;
- if(insert==FALSE)
- {
- byte=0;
- Out(&byte,1L); offset++;
- k=strlen(&s)+1;
- offset+=k;
- Out(&s,k);
- }
- else
- {
- byte=1;
- Out(&byte,1L); offset++;
- printf("Info: Bild %02ld <%s> wird eingefügt - ",page,&s);
- fh=Open(&s,MODE_OLDFILE);
- if(fh!=NULL)
- {
- Seek(fh,0,OFFSET_END);
- z=Seek(fh,0,OFFSET_BEGINNING);
- Out(&z,4L); offset+=4;
- x=Read(fh,&Buffer,2048);
- while(x>0)
- {
- Out(&Buffer,x); offset+=x;
- x=Read(fh,&Buffer,2048);
- }
- printf("%ld KBytes.\n",z/1024);
- Close(fh);
- }
- else
- {
- Stop(30);
- }
- }
- page=-1;
- }
-
- else if(!(strncmp(&mem,"index",5)))
- {
- if(page!=-1)
- {
- Stop(2);
- }
- page=atol(&mem[5]);
- if(page==0) MainIndex=TRUE;
- if(page>999) Stop(4);
- cmd=1;
- MOffset[page]=0;
- TOffset[page]=0;
- Length[page]=0;
- Offset[page]=offset;
- Flags[page]=PAGE_INDEX;
- a=10; b=0;
- while((mem[a]>25)&&(b<290))
- {
- s[b]=mem[a]; a++; b++;
- }
- s[b]=0x00;
- k=strlen(&s)+1;
- offset+=k;
- Out(&s,k);
- length=0;
- }
-
- else if(!(strncmp(&mem,"goto",4)))
- {
- if(page!=-1)
- {
- k=atol(&mem[5]);
- if(k>999) Stop(4);
- if(k!=page)
- {
- GoTo[GoToCnt]=k; GoToCnt++;
- }
- }
- else Stop(3);
- }
-
- else if(!(strncmp(&mem,"gad",3)))
- {
- if(page!=-1)
- {
- k=atol(&mem[4]);
- if(k>999) Stop(4);
- if(k!=page)
- {
- GoGad[GoGadCnt]=k; GoGadCnt++;
- }
- }
- else Stop(3);
- }
-
- else if(!(strncmp(&mem,"gpic",4)))
- {
- if(page!=-1)
- {
- k=atol(&mem[5]);
- if(k>99) Stop(8);
- GoPic[GoPicCnt]=k; GoPicCnt++;
- }
- else Stop(3);
- }
-
- else if(!(strncmp(&mem,"space",5)))
- {
- if(page!=-1)
- {
- GoTo[GoToCnt]=2000; GoToCnt++;
- }
- else Stop(6);
- }
-
- else if(!(strncmp(&mem,"gspace",6)))
- {
- if(page!=-1)
- {
- GoGad[GoGadCnt]=2000; GoGadCnt++;
- }
- else Stop(6);
- }
-
- else if(!(strncmp(&mem,"pspace",6)))
- {
- if(page!=-1)
- {
- GoPic[GoPicCnt]=200; GoPicCnt++;
- }
- else Stop(6);
- }
-
- else if(!(strncmp(&mem,"endfile",7)))
- {
- goto ende;
- }
-
- else
- {
- Stop(5);
- }
- }
- }
- else
- {
- zeile++;
- /* Seitentext */
- if(cmd!=-1)
- {
- if(TOffset[page]==0) TOffset[page]=offset;
- if(chr==10)
- {
- mem[0]=0;
- Out(&mem,1); offset++; length++;
- }
- else
- {
- if(Flags[page]==PAGE_TEXT) WriteStyles();
- IPos--;
- j=Get(&mem,1);
- while((j==1)&&(mem[0]!=10))
- {
- if((mem[0]=='`')&&(Flags[page]==PAGE_TEXT))
- {
- j=Get(&mem[1],1);
- if((j==1)&&(mem[1]!='`'))
- {
- switch(toupper(mem[1]))
- {
- case 'F':
- style=1;
- break;
- case 'K':
- style=3;
- break;
- case 'U':
- style=4;
- break;
- case 'I':
- style=7;
- break;
- case 'N':
- style=0;
- break;
- case 'R':
- style=0; fp=33; bp=40;
- break;
- default:
- if((mem[1]>='0')&&(mem[1]<='8'))
- {
- j=Get(&mem[2],1);
- if(j==1)
- {
- if((mem[2]>='0')&&(mem[2]<='8'))
- {
- fp=(mem[1]-48)+30;
- bp=(mem[2]-48)+40;
- }
- }
- }
- break;
- }
- WriteStyles();
- }
- else
- {
- if(j==1)
- {
- mem[0]='`';
- Out(&mem,1); offset++; length++;
- }
- }
- }
- else
- {
- Out(&mem,1); offset++; length++;
- }
- j=Get(&mem,1);
- }
- mem[0]=0x00;
- Out(&mem,1); offset++; length++;
- }
- }
- else
- {
- Stop(7);
- }
- }
- j=Get(&mem,1);
- chr=mem[0];
- }
- ende:
- byte=0; langwort=offset;
- for(i=0;i<1000;i++)
- {
- if(Offset[i]==0)
- {
- Out(&byte,1); offset++;
- }
- else
- {
- Out(&Flags[i],1);
- Out(&Length[i],2);
- Out(&Offset[i],4);
- Out(&TOffset[i],4);
- Out(&GOffset[i],4);
- Out(&MOffset[i],4);
- Out(&POffset[i],4);
- offset+=1;
- offset+=2;
- offset+=4;
- offset+=4;
- offset+=4;
- offset+=4;
- offset+=4;
- }
- }
- for(i=0;i<100;i++)
- {
- Out(&PNOffset[i],4);
- offset+=4;
- }
- Out(&langwort,4); offset+=4;
- printf("Check: %lx - %lx\n",OPos,offset);
- printf("Schreibe Hilfe-Datei ...\n");
- langwort=Write(out,OutBuf,OPos);
- Close(out);
- if(langwort!=OPos)
- {
- printf("FEHLER! Übersetzte Hilfe-Datei kann nicht gespeichert werden!\n");
- DeleteFile(argv[2]);
- }
- printf("Fertig.\n");
- }
- else
- {
- printf("Ausgabedatei \"%s\" konnte nicht eröffnet werden!\n",argv[2]);
- }
- FreeMem(InBuf,BufferSize);
- }
- else
- {
- printf("Nicht genug Speicher für Compiliervorgang!\n");
- }
- Close(in);
- }
- else
- {
- printf("Eingabedatei \"%s\" konnte nicht geöffnet werden!\n",argv[1]);
- }
- exit(0);
- }
-
-